package com.lanhu.designpattern.singleton.lazy;

/**
 * author:zhangzg
 * date:2020/11/1 0:06
 * 这种双检锁模式也会存在问题，多线程情况下，会出现某个线程获取到的实例对象虽然被赋予默认值，但其初始化还未完成的情况。
 * 这种问题的解决办法则是添加volatile关键字，但volatile也会有性能损耗。
 */
public class SingletonDoubleCheckLazy {

    /**
     * 加上volatile关键字，解决重排序问题
     */
    private static volatile SingletonDoubleCheckLazy singletonDoubleCheckLazy = null;

    private SingletonDoubleCheckLazy() {
    }

    /**
     * 双重锁校验机制
     * @return
     *
     */
    public static SingletonDoubleCheckLazy getInstance(){

        if (singletonDoubleCheckLazy == null){
            synchronized (SingletonDoubleCheckLazy.class){
                if (singletonDoubleCheckLazy == null){
                    singletonDoubleCheckLazy = new SingletonDoubleCheckLazy();
                }
            }
        }

        System.out.println(singletonDoubleCheckLazy.hashCode());
        return singletonDoubleCheckLazy;
    }
}
